<template>
  <uni-popup
    ref="popup"
    type="center"
    background-color="#fff"
    @click="closeAndStopRecord"
  >
    <view class="popup-content" @click.stop>
      <view class="record-icon-box">
        <uni-icons
          type="mic-filled"
          size="120"
          :color="info.iconColor"
        ></uni-icons>
      </view>

      <view class="record-time-box">
        <text>{{ info.recordTime }}</text>
      </view>

      <view class="record-btn-box">
        <button v-show="info.recordFlag" @tap="startRecord">开始录音</button>
        <button v-show="!info.recordFlag" @tap="endRecord">停止录音</button>
      </view>
    </view>
  </uni-popup>
</template>

<script setup>
import utils from '@/common/js/utils/index.js';
const { Custom_sendLog } = utils; // 输出日志

import { request, getBaseUrl } from '@/api/request';

import { FileUploadPublic } from '@/api';

const popup = ref(null);
const emit = defineEmits(['recordBack']);

const info = reactive({
  iconColor: '#000',
  voicePath: '',
  recordFlag: true,
  baseTime: 30, // 基础时长30秒
  recordTime: 30,
  isRecording: false, // 是否正在录音
  recorder: null, // 录音对象
  countdownInterval: null, // 倒计时定时器
});

// 打开弹窗
const open = () => popup.value.open();

// 关闭弹窗
const close = () => popup.value.close();

// 开始录音
const startRecord = () => {
  console.log('开始录音');
  info.iconColor = '#f00';
  info.recordFlag = false;
  info.isRecording = true;

  // 初始化录音对象
  info.recorder = plus.audio.getRecorder({
    format: 'mp3', // 录音文件格式
    numberOfChannels: 1, // 录音通道数
    sampleRate: 44100, // 采样率
  });

  // 开始录音
  info.recorder.record(
    {
      filename: '_doc/audio/', // 录音文件保存路径（_doc 是应用私有目录）
      format: 'mp3', // 录音文件格式
    },
    (filePath) => {
      info.voicePath = filePath; // 保存录音文件路径
      // uploadAudio(filePath); // 上传录音文件
      uploadAudio(filePath); // 上传录音文件
    },
    (error) => {
      console.error('录音失败:', error);
      uni.showToast({
        title: '录音失败',
        icon: 'none',
      });
    }
  );

  // 开始倒计时
  info.recordTime = info.baseTime;
  info.countdownInterval = setInterval(() => {
    if (info.recordTime > 0) {
      info.recordTime--;
    } else {
      endRecord(); // 如果倒计时结束，自动停止录音
    }
  }, 1000);
};

// 停止录音
const endRecord = () => {
  console.log('停止录音');
  info.iconColor = '#000';
  info.recordFlag = true;
  info.isRecording = false;

  if (info.recorder) {
    info.recorder.stop(); // 停止录音
  }

  clearInterval(info.countdownInterval); // 清除倒计时
  info.recordTime = info.baseTime; // 重置倒计时
  close();
};

// 关闭弹窗并停止录音
const closeAndStopRecord = () => {
  endRecord(); // 停止录音
};

// 将文件路径转换为 File 对象
const pathToFile = (filePath) => {
  // 获取文件名
  const fileName = filePath.split('/').pop();
  // 获取文件类型（扩展名）
  const fileType = fileName.split('.').pop(); // 'mp3'

  return new Promise((resolve, reject) => {
    // 在 H5 平台，使用 uni.getFileSystemManager().readFile 读取文件
    uni.getFileSystemManager().readFile({
      filePath: filePath,
      success: (res) => {
        // 将文件内容转换为 Blob 对象
        const blob = new Blob([res.data], { type: 'audio/' + fileType });
        // 创建 File 对象
        const file = new File([blob], fileName, { type: 'audio/' + fileType });
        resolve(file);
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
};

const uploadAudio = (filePath) => {
  let baseUrl = getBaseUrl() || '';
  if (!baseUrl.endsWith('/')) {
    baseUrl = baseUrl + '/';
  }

  const task = plus.uploader.createUpload(
    `${baseUrl}eis.gridfileload?service=appuService&method=upload&loadflag=upload`,
    {
      method: 'POST',
      blocksize: 0, // 每次上传 200KB 的数据块
      priority: 100, // 设置最高优先级
      timeout: 120, // 设置超时时间为 120 秒
    },
    (uploadedFile, status) => {
      if (status == 200) {
        try {
          const response = JSON.parse(uploadedFile.responseText);
          if (response.code === '0') {
            emit('recordBack', response.data);
          } else {
            uni.showToast({
              title: '录音上传失败',
              icon: 'none',
            });
          }
          // console.log('Parsed response:', response);
          // plus.nativeUI.toast('上传成功', { verticalAlign: 'center' });
        } catch (error) {
          // console.error('Error parsing response:', error);
          plus.nativeUI.toast('上传成功，但解析响应失败', {
            verticalAlign: 'center',
          });
        }
      } else {
        console.error('上传失败:', status);
        plus.nativeUI.toast(`上传失败: ${status}`, { verticalAlign: 'center' });
      }
    }
  );

  task.addFile(filePath, { key: 'file' });

  task.setRequestHeader(
    'Referer',
    `${baseUrl}/eis.form?service=archiveQueryService&method=page`
  );
  task.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

  task.start();
};

// 组件卸载时停止录音
onUnmounted(() => {
  if (info.recorder && info.isRecording) {
    info.recorder.stop(); // 停止录音
  }
  clearInterval(info.countdownInterval); // 清除倒计时
});

defineExpose({
  open,
  close,
});
</script>

<style lang="scss" scoped>
.popup-content {
  background-color: #fff;
  border-radius: 20rpx;
  overflow: hidden;
  width: 60%;
  height: auto;
  position: fixed;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);

  .record-icon-box {
    padding-top: 20rpx;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .record-time-box {
    text-align: center;
    font-size: 40rpx;
    color: #333;
  }

  .record-btn-box {
    padding-top: 20rpx;
  }
  button {
    width: 100%;
    height: 80rpx;
    line-height: 80rpx;
    text-align: center;
    background-color: #007aff;
    color: #fff;
    border: none;
    border-radius: 0;
    margin: 0;
    padding: 0;
  }
}
</style>
